int *path;
int **result; 
int pathTop; // 存放 path 长度
int resultTop; // 存放结果集长度

// 定义回溯算法
void backtracking(int n, int k, int startIndex) {
    // 如果 path 长度为 k 则将其保存到结果集中，并结束递归
    if (pathTop == k) {
        int *temp = (int *)malloc(sizeof(int) * k);
        for (int i = 0; i < k; i++) {
            temp[i] = path[i];
        }
        result[resultTop++] = temp;
        return;
    }

    for(int i = startIndex; i <= n; i++) {
        path[pathTop++] = i; // 把当前节点加入到 path 中
        backtracking(n, k, i + 1); // 递归搜索下一个节点
        pathTop--; // 递归结果后回溯
    }
}

// 定义组合函数
int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {
    path = (int *)malloc(sizeof(int) * k);
    result = (int **)malloc(sizeof(int) * 10000);
    pathTop = resultTop = 0;

    backtracking(n, k, 1);

    *returnSize = resultTop;
    *returnColumnSizes = (int *)malloc(sizeof(int) * resultTop);
    for(int i = 0; i < resultTop; i++) {
        (*returnColumnSizes)[i] = k;
    }

    return result;
}